package com.zzh.dp;
//给你一个 m * n 的矩阵，矩阵中的元素不是 0 就是 1，请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数。
//
//
//
// 示例 1：
//
// 输入：matrix =
//[
//  [0,1,1,1],
//  [1,1,1,1],
//  [0,1,1,1]
//]
//输出：15
//解释：
//边长为 1 的正方形有 10 个。
//边长为 2 的正方形有 4 个。
//边长为 3 的正方形有 1 个。
//正方形的总数 = 10 + 4 + 1 = 15.
//
//
// 示例 2：
//
// 输入：matrix =
//[
//  [1,0,1],
//  [1,1,0],
//  [1,1,0]
//]
//输出：7
//解释：
//边长为 1 的正方形有 6 个。
//边长为 2 的正方形有 1 个。
//正方形的总数 = 6 + 1 = 7.
//
//
//
//
// 提示：
//
//
// 1 <= arr.length <= 300
// 1 <= arr[0].length <= 300
// 0 <= arr[i][j] <= 1
//
// Related Topics 数组 动态规划
// 👍 76 👎 0
public class No1277_countSquares {
    public static void main(String[] args) {
        No1277Solution solution = new No1277Solution();
        int i = solution.countSquares(new int[][]{
                {0, 1, 1, 1},
                {1, 1, 1, 1},
                {0, 1, 1, 1}
        });
        System.out.println(i);
    }
}

class No1277Solution {
    public int countSquares(int[][] matrix) {
        int max=0;
        for (int row=0;row<matrix.length;row++){
            for (int col=0;col<matrix[0].length;col++){
                if (row==0||col==0){

                }else if (matrix[row][col]==0){
                    matrix[row][col]=0;
                }else {
                    matrix[row][col]=threeMin(matrix[row][col-1],matrix[row-1][col],matrix[row-1][col-1])+1;
                }
                max+=matrix[row][col];
            }
        }

        return max;
    }
    public int threeMin(int a,int b,int c){
        return Math.min(Math.min(a,b),c);
    }
}
